#!/usr/bin/env python
# -*- coding: UTF8 	-*-

from GladeConnect import GladeConnect
import gtk
import sys
import time
import datetime
import dialogos
import debugwindow
import SimpleTree
import ifd
from strSQL.recepcion_insumo import strSelectStockInsumo, strSelectStockEstanques
from strSQL.basicas import strSelectMovimientoEstanque
from psycopg2 import connect
import completion
import comunes
import treetohtml
from kiwi.ui.dateentry import DateEntry
import datetime

(CODIGO_CUBA,
 DESCRIPCION_CUBA,
 CANTIDAD_CUBA,
 TIPO,
 CODIGO,
 CODIGO_INTERNO,
 FECHA) = range (7)

class wnStockEstanques(GladeConnect):
    def __init__(self, conexion=None, padre=None, root="wnStock"):
        GladeConnect.__init__(self, "glade/wnStock.glade", root)
        self.cnx = conexion
        self.cursor = self.cnx.cursor()
        self.padre = padre
        if padre is None :
            self.wnStock.maximize()
            self.frm_padre = self.wnStock
            self.wnStock.set_title("Stock en Estanques")
        else:
            self.frm_padre = padre.frm_padre
            
        self.crea_columnas()
        self.crea_filtro()
        self.entFechaDesde.do_grab_focus()
        
        self.carga_datos()
        #self.carga_datos("fermentacion", True)
        #self.carga_datos("mezcla", True)
        #Todo: HACER LAS MACERACIONES CON UNA FUNCION PROPIA...

    def crea_columnas(self):
        columnas = []
        columnas.append ([CODIGO_CUBA, "Código Estanque", "int"])
        columnas.append ([DESCRIPCION_CUBA, "Descripción", "str"])
        columnas.append ([CANTIDAD_CUBA, "Cantidad", "str"])
        columnas.append ([TIPO, "Tipo", "str"])
        columnas.append ([CODIGO, "Código Origen", "str"])
        columnas.append ([CODIGO_INTERNO, "Código Destino", "str"])
        columnas.append ([FECHA, "Fecha", "dte"])
        
        self.modelo = gtk.ListStore(str, str, str)
        SimpleTree.GenColsByModel(self.modelo, columnas, self.treeStock)
        self.col_data = [x[0] for x in columnas]
        
    def on_btnImprimir_clicked(self, btn=None):
        t = treetohtml.TreeToHTML(self.treeStock,"Stock en Estanques", self.col_data)
        t.show()
    
    def crea_filtro(self):
        self.frame = gtk.Frame("Filtro")
        self.hboxBusqueda.pack_start(self.frame)
        
        hb = gtk.HBox(spacing=6)
        self.frame.add(hb)
        hb1 = gtk.HBox(spacing=6)
        hb.pack_start(hb1)
        self.entFechaDesde = DateEntry()
        self.entFechaHasta = DateEntry()
        #FIXME: se debe obtener la fecha de inicio desde un parametro
        
        self.entFechaDesde.set_date(datetime.date(2006,01,01))
        self.entFechaHasta.set_date(datetime.date.today())
        self.entOrigen = gtk.Entry()
        hb1.pack_start(gtk.Label("Desde:"), False, False)
        hb1.pack_start(self.entFechaDesde, False, False)
        hb1.pack_start(gtk.Label("Hasta:"), False, False)
        hb1.pack_start(self.entFechaHasta, False, False)
        self.hboxBusqueda.show_all()
    
    def carga_datos(self, tipo="", cargado = False):
        desde = self.entFechaDesde.get_date()
        hasta = self.entFechaHasta.get_date()
        
        self.modelo = gtk.ListStore(str, str, str, str, str, str, str)
        
        FECHA = "fecha"
        PORCENTAJE = "porcentaje"
        VOLUMEN = "volumen"
        MOVIMIENTO = "movimiento"
        CODIGO_ORIGEN = "cod_a"
        CODIGO_DESTINO = "cod_b"
        DESCRIPCION_ESTANQUE_ORIGEN = "desce_a"
        DESCRIPCION_ESTANQUE_DESTINO = "desce_b"
        SALDO = "saldo"
        CODIGO_ESTANQUE_ORIGEN = "code_a"
        CODIGO_ESTANQUE_DESTINO = "code_b"
        RENDIMIENTO = "rendimiento"
        
        sql = """SELECT codigo_estanque FROM traza.estanque"""
        self.cursor.execute(sql)
        e = self.cursor.dictfetchall()
        
        for codigo in e:
            sql = strSelectMovimientoEstanque
            
            where =  """ where ((code_a = %s or code_b = %s) and tipo < 10) or
            (code_b = %s and tipo = 10) """ % (codigo["codigo_estanque"],
                                              codigo["codigo_estanque"], codigo["codigo_estanque"])
            
            sql = sql.replace("order ", where + " order ")
            
            self.cursor.execute(sql)
            
            r = self.cursor.dictfetchall()
            saldo = 0
            co = -1
            
            for i in r:
                if co <> i[CODIGO_ORIGEN]:
                    co = i[CODIGO_ORIGEN]
                if i[CODIGO_ESTANQUE_DESTINO] == codigo["codigo_estanque"] and i[CODIGO_ESTANQUE_ORIGEN] == codigo["codigo_estanque"]:
                    if i[MOVIMIENTO] != "Mezcla a Mezcla" or i[MOVIMIENTO] != "Fermentacion a Fermentacion":
                        saldo = float(i[VOLUMEN])
                elif i[CODIGO_ESTANQUE_DESTINO] == codigo["codigo_estanque"]:
                    if i[MOVIMIENTO] == "Fermentacion a Mezcla":
                        saldo += float(i[VOLUMEN])*(float(i[RENDIMIENTO])/100)
                    else:
                        saldo += float(i[VOLUMEN])
                elif i[CODIGO_ESTANQUE_ORIGEN] == codigo["codigo_estanque"]:
                    saldo -= float(i[VOLUMEN])
                if saldo <= 0:
                    saldo = 0
                saldo = round(saldo)                
            i[SALDO] = saldo
            i[VOLUMEN] = round(float(i[VOLUMEN]))
            i[PORCENTAJE] = round(float(i[PORCENTAJE]))
            
            if i[CODIGO_ESTANQUE_ORIGEN] == codigo["codigo_estanque"]:
                self.modelo.append ((codigo["codigo_estanque"], i[DESCRIPCION_ESTANQUE_ORIGEN],
                                     i[SALDO],i[MOVIMIENTO], i[CODIGO_ORIGEN],
                                                     i[CODIGO_DESTINO], i[FECHA]))
            elif i[CODIGO_ESTANQUE_DESTINO] == codigo["codigo_estanque"]:
                self.modelo.append ((codigo["codigo_estanque"], i[DESCRIPCION_ESTANQUE_DESTINO],
                                         i[SALDO],i[MOVIMIENTO], i[CODIGO_ORIGEN],
                                                         i[CODIGO_DESTINO], i[FECHA]))

        self.treeStock.set_model(self.modelo)
    
    def on_btnRefrescar_clicked(self, btn=None):
        if self.modelo is None:
            return
        self.modelo.clear()
        self.carga_datos("maceracion")
        self.carga_datos("fermentacion", True)
        self.carga_datos("mezcla", True)
        
    def on_btnCerrar_clicked(self, btn=None):
        if self.padre is None:
            self.on_exit()
        else:
            self.padre.remove_tab("Stock en Estanques")
            
if __name__ == '__main__':
    cnx = connect("dbname=traza user=traza host=localhost password=123")
    #cnx.autocommit()
    sys.excepthook = debugwindow.show
    d = wnStockEstanques(cnx)
    
    gtk.main()
